#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
#include <WiFi.h>
#include <esp_now.h>
#define LED_pin 2
// 设置数据结构体
typedef struct struct_message
{
    String board_name;
    double motor1_angle;
    double motor2_angle;
} struct_message;

struct_message myData;

// 数据接收回调函数
void OnDataRecv(const uint8_t *mac, const uint8_t *incomingData, int len)
{
    memcpy(&myData, incomingData, sizeof(myData));
    // myData.motor1_angle = !myData.motor1_angle;
    // if (myData.motor1_angle == 0)
    // {
    //     digitalWrite(LED_pin, LOW);
    // }
    // else
    // {
    //     digitalWrite(LED_pin, HIGH);
    // }
}

void setup()
{
    Serial.begin(115200);
    pinMode(LED_pin, OUTPUT);
    // 初始化 ESP-NOW
    WiFi.mode(WIFI_STA);
    if (esp_now_init() != 0)
    {
        Serial.println("Error initializing ESP-NOW");
        return;
    }
    // 设置接收数据回调函数
    esp_now_register_recv_cb(OnDataRecv);
}

void loop()
{
    Serial.printf("%s,电机一：%lf,电机二：%lf\n", myData.board_name, myData.motor1_angle, myData.motor2_angle);
}
// 同样，我们在开头引入了 ESP-NOW 相关的头文件：WiFi.h 与 esp_now.h。然后定义了传感器的引脚和一个名为 myData 的结构体，该结构体由 3 个不同数据组成，分别是开发板名称（board_name），光线值（motor1_angle）与声音值（motor1_angle），与数据发送端定义的一模一样。
// 我们注册了一个 OnDataRecv() 的数据接收回调函数，该函数反馈了 ESP-NOW 数据的接收状态，当接收到来自其他开发板的消息时，将消息保存到结构体 myData 中，并在串口中打印出接收到的消息。
// 这里 ESP-NOW 的消息的接收属于无阻塞的接收方式，不受延时函数 delay() 的影响，这意味着 loop() 里面可以执行其他任务而不会影响到板间的通讯，同一块板子既可以当做接收方亦可以当做发送方互不影响。这里可以同时接收来自多块板子的信息，但前提是保持相同的结构体，当然你也可以不用结构体用普通的单一类型的数据类型比如字符串之类的，这里用结构体的原因是需要发送的数据类型有多个，使用结构体相对灵活。
